package br.com.designless.view.servlet.filter;

import br.com.designless.business.model.Usuarios;
import br.com.designless.view.Util.Util;
import br.com.designless.view.helper.UsuarioHelper;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author diogenes.feijo
 */
public class LoginFilter implements Filter {

    private static final String PAGINA_LOGIN = "/index.jsp";
    private static final String PAGINA_CADASTRO = "/cadastroUsuario.jsp";
    private static final String PAGINA_RECUPERACAO_DADOS_CADASTRAIS_USUARIO = "/recuperacaoDadosCadastraisUsuario.jsp";
    private static final String PREFIXO_DWR = "/dwr";

    private static final String PAGINA_CADASTRO_JOGO = "/cadastroJogo.jsp";
    private static final String PAGINA_CADASTRO_LOCAL_JOGO = "/cadastroLocalJogo.jsp";
    private static final String PAGINA_CADASTRO_USUARIO = "/cadastroUsuario.jsp";
    private static final String PAGINA_LISTAGEM_JOGOS = "/listagemJogos.jsp";
    private static final String PAGINA_LISTAGEM_LOCAIS_JOGO = "/listagemLocaisJogo.jsp";
    private static final String PAGINA_LISTAGEM_TIPOS_USUARIO = "/listagemTiposUsuario.jsp";
    private static final String PAGINA_LISTAGEM_USUARIOS = "/listagemUsuarios.jsp";

    private UsuarioHelper usuarioHelper  = new UsuarioHelper();

    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        httpServletResponse.setHeader("Expires", "-1");
        httpServletResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        httpServletResponse.addHeader("Cache-Control", "post-check=0, pre-check=0");
        httpServletResponse.setHeader("Pragma", "no-cache");

        String caminho = httpServletRequest.getServletPath();
        String acao = request.getParameter("acao");

        if (!usuarioHelper.isUsuarioLogado(httpServletRequest)) {
            if (!isCaminhoPermitido(caminho, acao)) {
                Util.mostrarMensagemErro(httpServletRequest,
                                httpServletResponse,
                                UsuarioHelper.FORWARD_INICIO,
                                "Você deve estar logado para acessar o site");
  
                return;
            }
        } else {
            if (PAGINA_LOGIN.equals(caminho)
                    || UsuarioHelper.ACAO_CANCELAR.equals(acao)) {
                
                Util.encaminharRequisicao(
                    httpServletRequest, httpServletResponse, UsuarioHelper.FORWARD_JOGOS);

                return;
            }

            Usuarios usuario = usuarioHelper.getUsuarioSessao(httpServletRequest);

            if (!isAcessoPermitido(usuario, caminho)) {
                Util.mostrarMensagemErro(httpServletRequest,
                                         httpServletResponse,
                                         UsuarioHelper.FORWARD_ACESSO_NEGADO,
                                         "Você não tem acesso para visualizar este recurso");

                return;
            }
        }

        chain.doFilter(httpServletRequest, httpServletResponse);
    }

    private boolean isCaminhoPermitido(String caminho, String acao) {
        return (UsuarioHelper.ACAO_LOGIN.equals(acao)
                    || UsuarioHelper.ACAO_LOGOUT.equals(acao)
                    || UsuarioHelper.ACAO_NOVO_USUARIO.equals(acao)
                    || UsuarioHelper.ACAO_CANCELAR.equals(acao)
                    || UsuarioHelper.ACAO_RECUPERAR_DADOS_USUARIO.equals(acao)
                    || PAGINA_CADASTRO.equals(caminho)
                    || PAGINA_LOGIN.equals(caminho)
                    || PAGINA_RECUPERACAO_DADOS_CADASTRAIS_USUARIO.equals(caminho)
                    || caminho.startsWith(PREFIXO_DWR));
    }

    private boolean isAcessoPermitido(Usuarios usuario, String caminho) {
        if (!usuarioHelper.isUsuarioAdministrador(usuario)) {
            return !(PAGINA_CADASTRO_JOGO.equals(caminho)
                        || PAGINA_CADASTRO_LOCAL_JOGO.equals(caminho)
                        || PAGINA_CADASTRO_USUARIO.equals(caminho)
                        || PAGINA_LISTAGEM_JOGOS.equals(caminho)
                        || PAGINA_LISTAGEM_LOCAIS_JOGO.equals(caminho)
                        || PAGINA_LISTAGEM_TIPOS_USUARIO.equals(caminho)
                        || PAGINA_LISTAGEM_USUARIOS.equals(caminho));
        }

        return true;
    }

    public void init(FilterConfig filterConfig) throws ServletException {}

    public void destroy() {}

}